package com.grace.project.common.util.spring;

import java.util.Map;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

/**
 * 以静态变量保存Spring ApplicationContext，可以在任何代码任何地方任何时候取出ApplicationContext
 * @author Administrator
 *
 */
public class SpringContextHolder implements ApplicationContextAware{

	private static ApplicationContext applicationContext;

	/**
	 * 实现ApplicationContextAware接口的context注入函数，将其存入静态变量
	 */
	@Override
	public void setApplicationContext(ApplicationContext applicationContext)
			throws BeansException {
		SpringContextHolder.applicationContext = applicationContext;
	}
	
	/**
	 * 取得存储在静态变量中的ApplicationContext.
	 * @return  
	 */
	public static ApplicationContext getApplicationContext(){
		checkApplicationContext();
		return applicationContext;
	}
	
	/** 
	* 从静态变量ApplicationContext中取得Bean, 自动转型为所赋值对象的类型. 
	*/  
	@SuppressWarnings("unchecked")  
	public static <T> T getBean(String name) {  
		checkApplicationContext();  
		return (T) applicationContext.getBean(name);  
	}
	
	/** 
	* 从静态变量ApplicationContext中取得Bean, 自动转型为所赋值对象的类型. 
	*/  
	public static <T> T getBean(Class<T> clazz) {  
		checkApplicationContext();
		return (T) applicationContext.getBean(clazz);  
	}  
	  
	/** 
	* 从静态变量ApplicationContext中取得Bean, 自动转型为所赋值对象的类型. 
	 * @param <T>
	*/  
	public static <T> T getBean(Class<T> clazz,String beanName) {  
		checkApplicationContext();  
		Map<String ,T> map =  applicationContext.getBeansOfType(clazz);
		T t = null;
		for (String key:map.keySet()) {
			if(key.equals(beanName)){
				t = map.get(key);
			}
		}
		return t;
	}

	/** 
	* 清除applicationContext静态变量. 
	*/  
	public static void cleanApplicationContext() {  
		applicationContext = null;  
	}  
	
	private static void checkApplicationContext() {  
		if (applicationContext == null) {  
			throw new IllegalStateException("applicaitonContext未注入,请在applicationContext.xml中定义SpringContextHolder");  
		}  
	}
	
}
